package org.rk.core.tools.office.util.pdfUtil;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.rk.core.common.util.RKAlert;
import org.rk.core.common.util.RkObjectUtil;
import org.rk.core.common.util.RkStrUtil;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

/**
 * @类描述：
 * @author 曹仁道
 * 2017年1月4日 下午5:54:14
 */
public class PdfGridUtil {
	//private final static String encoding="UTF-8";
	private final static Integer colNum=26;//网格列数,固定控制,自行根据需要跨行跨列
	private static Float rowHeight=20.0f;//行高
	private static BaseFont bfChinese;
	
	/**
	 * @方法描述：创建pdf网格
	 * @author:曹仁道
	 * 2017年1月4日 下午5:55:09
	 * @param gridBean
	 */
	private static ByteArrayOutputStream createPdfGrid(PdfGridTableBean gridBean){
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		Rectangle rect = new Rectangle(PageSize.A4);// 标准A4纸张
		rect.setBackgroundColor(BaseColor.WHITE);// 页面背景色
		Document doc = new Document(rect);
		try {
			PdfWriter writer = PdfWriter.getInstance(doc, baos);
			writer.setPdfVersion(PdfWriter.PDF_VERSION_1_7);// 设置PDF版本（默认1.4)
			// 文档属性
			doc.addTitle("pdfTable"); // 标题
			doc.addAuthor("kingmon");// 作者
			doc.addKeywords("pdfTable");// 关键字
			doc.addCreator("kingmon");// 创建者

			bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
			Font titleChinese = new Font(bfChinese, gridBean.getTitleFontSize(), gridBean.getTitlefontStyle());// 标题
			Font childTitleChinese = new Font(bfChinese, gridBean.getChildTitleFontSize(), gridBean.getChildTitleStyle());// 副标题

			doc.open();// 打开文档
			if (RkStrUtil.hasText(gridBean.getTitle())) {
				Paragraph paragTitle = new Paragraph(gridBean.getTitle(), titleChinese);// 设置标题
				paragTitle.setAlignment(Element.ALIGN_CENTER);// 设置对齐方式
				paragTitle.setLeading(1f);// 设置行间距
				paragTitle.setSpacingAfter(10f);
				// title.setSpacingBefore(10f);
				doc.add(paragTitle);
			}
			if (RkStrUtil.hasText(gridBean.getChildTtile())) {
				Paragraph paragChildTitle = new Paragraph(gridBean.getChildTtile(), childTitleChinese);// 设置副标题
				paragChildTitle.setAlignment(Element.ALIGN_CENTER);// 设置对齐方式
				paragChildTitle.setLeading(0.5f);// 设置行间距
				paragChildTitle.setSpacingAfter(10f);
				paragChildTitle.setSpacingBefore(10f);
				doc.add(paragChildTitle);
			}
			//创建网格
			//for (int i=0;i<gridBean.getRowNum();i++) {
				genPdfGrid(doc,gridBean);
			//}
			doc.close();
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return baos;
	}
	private static void genPdfGrid(Document doc,PdfGridTableBean gridBean){
		try {
			PdfPTable table=new PdfPTable(colNum);
			table.setSpacingBefore(10f);
			table.setWidthPercentage(100);// 设置表格宽度为100%
			genPdfGridCell(table, gridBean);
			doc.add(table);
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private static void genPdfGridCell(PdfPTable table,PdfGridTableBean gridBean){
		List<PdfGridCellBean> contentList=gridBean.getContentList();
		List<PdfGridCellBean> inscribeList=gridBean.getInscribeList();
		boolean isExit=false;
		if(!RkObjectUtil.isEmpty(inscribeList)&&inscribeList.size()>0){
			isExit=true;
		}
		boolean isPerInscribe=gridBean.isPerInscribe();
		int count=contentList.size();
		int celNum=0;
		for (int i=0;i<count;i++) {
			PdfGridCellBean contentCell=contentList.get(i);
			int colSpan=contentCell.getColspan()>1?contentCell.getColspan():1;
			celNum+=colSpan;
			if(celNum%885==0&&isExit&&isPerInscribe){//达到每页网格最大值时，如果需要构建落款的话
				for(int j=0;j<inscribeList.size();j++){
					if((i==(contentList.size()-1))&&(j==(inscribeList.size()-1))){
						fillCell(table, inscribeList.get(j), true);
					}else{
						fillCell(table, inscribeList.get(j), false);
					}
				}
				i--;
			}else{
				if((i==(contentList.size()-1))){
					fillCell(table, contentCell, true);
				}else{
					fillCell(table, contentCell, false);
				}
			}
		}
		//内容填充完最后添加落款
		if(isExit&&((isPerInscribe&&celNum%883!=0)||!isPerInscribe)){//被883整除的已经在循环中添加了
			//int cha=(page*883)-count;//余下的格数添加到下一页
			//PdfGridCellBean buRow=new PdfGridCellBean("", 26);//跨所有列
			//buRow.setRowspan(cha);//跨所有差的行
			//fillCell(table, buRow, false);
			//填充落款
			for(int j=0;j<inscribeList.size();j++){
				if((j==(inscribeList.size()-1))){
					fillCell(table, inscribeList.get(j), true);
				}else{
					fillCell(table, inscribeList.get(j), false);
				}
			}
		}
	}
	private static void fillCell(PdfPTable table,PdfGridCellBean pdfGridCellBean,boolean isCompleateRow){
		PdfPTable childTable=genChildTable(pdfGridCellBean);
		PdfPCell cell=new PdfPCell(childTable);
		
		//跨行跨列
		if(pdfGridCellBean.getColspan()>0){
			cell.setColspan(pdfGridCellBean.getColspan());
		}
		if(pdfGridCellBean.getRowspan()>0){
			cell.setFixedHeight(rowHeight*pdfGridCellBean.getRowspan());//高度设置为需要跨行的倍数
			cell.setRowspan(pdfGridCellBean.getRowspan());
		}else{
			cell.setFixedHeight(rowHeight);
		}
		cell.setHorizontalAlignment(pdfGridCellBean.getHorizontal());//水平对齐方式
		cell.setVerticalAlignment(pdfGridCellBean.getVertical());//垂直对齐方式
		table.addCell(cell);
		if(isCompleateRow){
			table.completeRow();
		}
	}
	private static PdfPTable genChildTable(PdfGridCellBean cellBean){
		PdfPTable childTable=new PdfPTable(1);//内嵌入表格
		//如果有图片设置图片
		if(cellBean.getPdfImageBeanList()!=null&&cellBean.getPdfImageBeanList().size()>0){
			for (PdfImageBean pdfImageBean : cellBean.getPdfImageBeanList()) {
				if(pdfImageBean!=null){
					PdfPCell childCell=new PdfPCell();
					childCell.setBorderWidth(0f);//隐藏嵌入表格的边框
					Image image=null;
					try {
						image = Image.getInstance(readStream(pdfImageBean.getImageInputStream()));
					} catch (Exception e) {
						e.printStackTrace();
						RKAlert.Error("读取图片发生错误");
					}
					image.scaleAbsolute(pdfImageBean.getWidth(), pdfImageBean.getHeight());
					childCell.setImage(image);
					childCell.setHorizontalAlignment(cellBean.getHorizontal());//水平对齐方式
					childCell.setVerticalAlignment(cellBean.getVertical());//垂直对齐方式
					childTable.addCell(childCell);
				}
			}
		}
		//如果有内容设置内容
		if(cellBean.getContentList()!=null&&cellBean.getContentList().size()>0){
			for (String str : cellBean.getContentList()) {
				PdfPCell childCell=new PdfPCell(new Phrase(str,setFont(cellBean.getFontSize(),cellBean.getFontStyle())));
				childCell.setBorderWidth(0f);//隐藏嵌入表格的边框
				childCell.setHorizontalAlignment(cellBean.getHorizontal());//水平对齐方式
				childCell.setVerticalAlignment(cellBean.getVertical());//垂直对齐方式
				childTable.addCell(childCell);
			}
		}
		return childTable;
	}
	public static byte[] readStream(InputStream is) throws Exception{  
        byte[] bytes = new byte[1024];  
        int leng;  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        while((leng=is.read(bytes)) != -1){  
            baos.write(bytes, 0, leng);  
        }  
        return baos.toByteArray();  
    }
	/**
	 * @方法描述：设置字体和字号
	 * @author:曹仁道
	 * 2016年11月2日 下午3:00:31
	 * @return
	 */
	private static Font setFont(float fontSize,int fontStyle){
		if(fontSize<=0){//默认8号
			fontSize=8;
		}
		if(fontStyle<0){//默认正常
			fontStyle=0;
		}
		Font font = new Font(bfChinese, fontSize, fontStyle);
		return font;
	}
	public static ByteArrayOutputStream genPdfTable(PdfGridTableBean gridBean){
		return createPdfGrid(gridBean);
	}
}
